package juego.Persistencia;

import java.io.File;


import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import juego.Jugador;
import juego.Dificultad.*;
import juego.Tablero.InfoTablero;
import juego.Tablero.PuntoInterseccion;
import juego.Tablero.Tablero;
import juego.Vehiculo.*;


public class PersistenciaDeJuego {
	
	private Guardado guardadoInterno;
	private static String _crearRuta(){
		return System.getProperty("user.home") + "/Persistencia";
	}
	
	private static void _testDirectorio() {
		File oDir = new File(_crearRuta());
		if (!oDir.exists())
			oDir.mkdir();
	}
	
	public static boolean hayPartidaJugador(String jugador) {
		_testDirectorio();
		File oFile = new File(crearRutaAPartirDeNombre(jugador));
		return oFile.exists();
	}
	
	public static void borrarPartidaJugador(String jugador) {
		_testDirectorio();
		File oFile = new File(crearRutaAPartirDeNombre(jugador));
		if (oFile.exists())
			oFile.delete();
	}
	
	public static String crearRutaAPartirDeNombre (String jugador){
		String ruta = _crearRuta() + "/" + jugador + ".xml";
		return ruta;
	}
	
	//GUARDAR
	private void guardarJugador (Jugador jugador){
		JugadorGuardable jugadorParaGuardar = new JugadorGuardable();
		jugadorParaGuardar.setNombre(jugador.getNombreJugador());
		jugadorParaGuardar.setMovimiento(jugador.getCantidadDeMovimientos());
		jugadorParaGuardar.setVehiculo(jugador.getVehiculo().darSuNombre());
		guardadoInterno.setJugador(jugadorParaGuardar);
	}
	
	private void guardarDificultad (Dificultad dificultad){
		DificultadGuardable dif = new DificultadGuardable();
		dif.setDificultad(dificultad.getIdentificador());
		guardadoInterno.setDificultad(dif);
		
	}
	
	private void guardarTablero(InfoTablero tablero){
		TableroGuardable tableroParaGuardar = new TableroGuardable();
		PuntoInterseccionGuardable meta = new PuntoInterseccionGuardable();
		meta.setCoordX(tablero.darPosicionLlegada().mostrarCoordenadaX());
		meta.setCoordY(tablero.darPosicionLlegada().mostrarCoordenadaY());
		tableroParaGuardar.setMeta(meta);
		PuntoInterseccionGuardable posicion = new PuntoInterseccionGuardable();
		posicion.setCoordX(tablero.darPosicionVehiculo().mostrarCoordenadaX());
		posicion.setCoordY(tablero.darPosicionVehiculo().mostrarCoordenadaY());
		tableroParaGuardar.setPosicion(posicion);
		tableroParaGuardar.setEncontrables(tablero.darEncontrablesDesactivados());
		guardadoInterno.setTablero(tableroParaGuardar);
		
	}
	
	public void guardar(Jugador jugador, InfoTablero tablero) {
		guardadoInterno = new Guardado();
		this.guardarJugador (jugador);
		this.guardarDificultad(tablero.darDificultad());
		this.guardarTablero (tablero);
		
		_testDirectorio();
		try {
			JAXBContext jaxbGuardado = JAXBContext.newInstance(Guardado.class);
			Marshaller jaxbMarshaller = jaxbGuardado.createMarshaller();
		
			String direccion = crearRutaAPartirDeNombre (jugador.getNombreJugador());
			File XMLGuardado = new File(direccion);
		
			jaxbMarshaller.marshal(guardadoInterno, XMLGuardado);
		} 
		catch (JAXBException e) {
		   e.printStackTrace();
		}
	}
	
	//CARGAR
	private void buscarJugador (String jugador){
		
		String direccion = crearRutaAPartirDeNombre (jugador);
		Guardado guardado = new Guardado();
		_testDirectorio();
		File XMLfile = new File(direccion);
		if (XMLfile.exists()){
			try {
				JAXBContext jaxbGuardado = JAXBContext.newInstance(Guardado.class);
				Unmarshaller jaxbUnmarshaller = jaxbGuardado.createUnmarshaller();
				guardado = (Guardado) jaxbUnmarshaller.unmarshal(XMLfile);
			} catch (JAXBException e) {
				   e.printStackTrace();
			}
		}
		this.guardadoInterno = guardado;
	}
	
	public void cargar (String nombreJugador){
		buscarJugador(nombreJugador);
	}
	
	public Dificultad cargarDificultad(){
		String dif = guardadoInterno.getDificultad().getDificultad();
		switch (dif){
		case "Facil" : return (new Facil());
		case "Moderado" : return (new Moderado());
		case "Dificil" : return (new Dificil());
		}
		return null;
	}
	
	public Jugador cargarJugador(){
		String vehiculo = guardadoInterno.getJugador().getVehiculo();
		Vehiculo vehiculoParaCargar = new Auto();
		switch (vehiculo){
		case "auto" : vehiculoParaCargar = new Auto();
					break;
		case "camioneta" : vehiculoParaCargar = new Camioneta ();
					break;
		case "moto" : vehiculoParaCargar = new Moto ();
					break;
		}
		Jugador jugadorParaCargar = new Jugador(guardadoInterno.getJugador().getNombre(),vehiculoParaCargar);
		jugadorParaCargar.setCantidadMovimientos(guardadoInterno.getJugador().getMovimiento());
		return jugadorParaCargar;
	}
	
	public Tablero cargarTablero (){
		Tablero tableroParaCargar = new Tablero(cargarDificultad());
		PuntoInterseccion meta = new PuntoInterseccion(guardadoInterno.getTablero().getMeta().getCoordX(),guardadoInterno.getTablero().getMeta().getCoordY());
		PuntoInterseccion posicion = new PuntoInterseccion(guardadoInterno.getTablero().getPosicion().getCoordX(),guardadoInterno.getTablero().getPosicion().getCoordY());
		tableroParaCargar.setMeta(meta);
		tableroParaCargar.setPosicionVehiculo(posicion);
		tableroParaCargar.desactivarEncontrables(guardadoInterno.getTablero().getEncontrables());
		return tableroParaCargar;
	}
}
